package com.fj.acMachine;

import org.ahocorasick.trie.Token;
import org.ahocorasick.trie.Trie;

import java.util.Collection;

/**
 * AC自动机算法
 * @author fj
 * @date 2024/2/7 09:44
 */
public class TestAcMachine {
    public static void main(String[] args) {
        String text = "徐顺用“爬行”来形容被困湖北仙桃高速的3天。" +
                
                "2月3日一早，他一家五口从武汉出发，驱车赶往300公里外的宜昌老家。两地都在湖北省内，路不算远，但仅是距离荆州服务区那4公里路，就堵了22小时。一路上，他只有一个念头，“离开这里，回家过年。”" +
                
                "2月3日入夜起，极端暴雪冻雨天气继续侵袭湖北，高速路上车辆拥堵加剧。湖北气象台数据显示，截至2月5日5时，湖北大部地区积雪深度达1至20厘米，其中21县（市、区）积雪深度超过10厘米。" +
                
                "据中新网消息，截至2月5日14时，湖北省高速公路收费站尚有100个因道路结冰采取交通管制措施，主要集中在武汉、孝感、荆州、黄冈、咸宁、随州等地区。" +
                
                "湖北高速上的三天三夜里，有人试着在积雪、饥饿与焦虑中自救，徒手扒开埋着轮胎的雪、翻过高速护栏到服务区买泡面；更多的人，在等待中互助，顶着严寒一起凿冰、一辆接一辆地推车。" +
                
                "“车子堵，我们人也心堵了”" +
                
                "2月3日一早，徐顺一家从武汉出发时，正下着小雪，他没太在意。" +
                
                "当天6时50分，武汉中心气象台发布暴雪橙色预警，预计3日至4日，宜昌、荆门、潜江、仙桃、武汉等地有大到暴雪，局部大暴雪。" +
                
                "相较天气，占据徐顺心头的是回乡的念想。72岁的他有10年没回老家宜昌过年了。之前儿子在深圳工作，他和妻子帮着带孙子，一家五口都是留在深圳过年。他说，回趟老家得大几千块钱，他舍不得。今年儿子调来武汉工作，开车回家也就几小时，幺弟的姑娘也将出嫁，他不想缺席。" +
                
                "但车开上湖北仙桃时，形势急转之下——开始堵了，平时他们沿途经过潜江市的路程也就俩小时，当时耗了近半天；当晚，他们离开潜江，距荆州服务区只剩四公里时，堵得他们愣是在车上熬夜了一宿，冷得直打哆嗦；徐顺知道，侄女的婚礼是赶不上了。" +
                
                "收看了天气预报，武婷和老乡自驾返乡前买好了轮胎防滑链，一行人从江苏无锡出发。2月3日早上，她和老乡驶入湖北省境内时，车开始打滑，防滑链派上了用场，结果当晚临近潜江服务区，他们几乎寸步难行，“车就是动个几百米，又停两三个小时”，武婷说。";
        Trie trie = Trie.builder()
                .ignoreOverlaps()//禁止出现交叉
//                .onlyWholeWords()//全字匹配
                .ignoreCase()//忽略大小写
                .addKeywords("宜昌","他","她","打滑","防滑链")
                .build();
        Collection<Token> tokens = trie.tokenize(text);
        StringBuffer sb = new StringBuffer();
        for (Token token:tokens){
            if (token.isMatch()) {
                sb.append("<b>");
            }
            sb.append(token.getFragment());
            if (token.isMatch()) {
                sb.append("</b>");
            }
        }
        System.out.println(sb);
    }
}
